package Negocio;



import ManejoExc.PersonalException;
import Ordenamiento.FechaComparator;
import Ordenamiento.OrdenTipoRol;
import Ordenamiento.RegistroHorarioComparator;
import java.util.ArrayList;

import java.sql.Date;
import java.sql.Time;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.Collections;



/**
 * @author Diego
 * @version 1.0
 * @created 28-sep-2013 21:50:23 p.m.
 */
public class Personal  {

	private Integer idPersonal;
        private String apellido;
	private String cuil;
        private String dni;
	private Date fechaNacimiento;
	private String nombre;
        private int legajo;
        
        private boolean activo; //Indica si el empleado esta en funciones en la empresa 
	
        
        private Set<Equipamiento> equipamientos;
        private List<RegistroHorario> registroHorarios;
        private Set<Rol> roles;

	//Constructores
        public Personal(){
        }
    public Personal(String apellido, String cuil, String dni, Date fechaNacimiento, String nombre, int legajo) {
        this.apellido = apellido;
        this.cuil = cuil;
        this.dni = dni;
        this.fechaNacimiento = fechaNacimiento;
        this.nombre = nombre;
        this.legajo = legajo;
        this.activo = true;
        this.equipamientos = new HashSet();
        this.registroHorarios = new ArrayList();  
        this.roles = new HashSet();
        
        Empresa.persistencia.insert(this);
    }

    //Set & Get
    public Integer getIdPersonal() {
        return idPersonal;
    }

    public void setIdPersonal(Integer idPersonal) {
        this.idPersonal = idPersonal;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getCuil() {
        return cuil;
    }

    public void setCuil(String cuil) {
        this.cuil = cuil;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public int getLegajo() {
        return legajo;
    }

    public void setLegajo(int legajo) {
        this.legajo = legajo;
    }

    public boolean getActivo() {
        return activo;
    }

    public void setActivo(boolean activo) {
        this.activo = activo;
    }

    public Set<Equipamiento> getEquipamientos() {
        return equipamientos;
    }

    public void setEquipamientos(Set<Equipamiento> equipamientos) {
        this.equipamientos = equipamientos;
    }

    public List<RegistroHorario> getRegistroHorarios() {
        return registroHorarios;
    }

    public void setRegistroHorarios(List<RegistroHorario> registroHorarios) {
        this.registroHorarios = registroHorarios;
    }

    public Set<Rol> getRoles() {
        return roles;
    }

    public void setRoles(Set<Rol> roles) {
        this.roles = roles;
    }

        //Metodos
        
        @Override
        public String toString(){
            return this.getLegajo()+":"+this.apellido + " "+ this.nombre + " | " + this.getCuil();
        }        
        
        public void agregarEquipamiento(Equipamiento unEquipamiento)throws PersonalException{
            if(this.superoMaximoEquipamiento(unEquipamiento.getUnInsumo().getTipoDeInsumo())){
                this.equipamientos.add(unEquipamiento);
                
            //Empresa.persistencia.update(this);
            }else{
                throw new PersonalException("El Personal supero la asignacino Maxima para el equipamiento de este tipo. Imposible Asignar");
            }
        }
        public void agregarRegistroHorario(RegistroHorario unRegistroHorario){
            this.registroHorarios.add(unRegistroHorario);
            Empresa.persistencia.update(this);
        }
        public void nuevoRegistroHorario(Date fecha,Date desde, Date hasta) throws PersonalException{
            this.agregarRegistroHorario(new RegistroHorario(fecha,desde.getTime() ,hasta.getTime(),this));
        }
                           
        public String horasTrabajadas(int mes, int anio){
            Long horasTrabajadas = new Long("0");
            RegistroHorario rh;
            Iterator it = this.registroHorarios.iterator();
             while(it.hasNext()){
                rh = (RegistroHorario) it.next();
                if(rh.mes() == mes && rh.anio() == anio ){
                    horasTrabajadas =  rh.horasTrabajadas() + horasTrabajadas;
                }
                
             }
            //Time result = new Time(horasTrabajadas);
            
            long minutes = (long) ((horasTrabajadas / (1000*60)) % 60);
            long hours   = (long) ((horasTrabajadas / (1000*60*60)));
            return hours+":"+minutes ;  
        }
       
  
        public void darDeBaja(){
            this.setActivo(false); //doy de baja
            Empresa.persistencia.update(this);
        }

        
        public String getClave(){ //Por si quiero cambiar la clave en los Map
            return this.cuil;
        }
        
        public List<RegistroHorario> getRegistroHorarioMes(int mes, int anio){
            List<RegistroHorario> salida = new ArrayList();
            RegistroHorario rh;
            Iterator it = this.getRegistroHorarios().iterator();
            while(it.hasNext()){
                rh = (RegistroHorario) it.next();                
                if(rh.anio() == anio && rh.mes() == mes ){
                    salida.add(rh);
                }
            }
            this.ordenarRegistroHorario(salida);
            return salida;
        } 
        
        public Set<RegistroHorario> getRegistroHorarioDia(int mes, int dia,int anio){
            Set<RegistroHorario> salida = new HashSet();
            RegistroHorario rh;
            Iterator it = this.getRegistroHorarios().iterator();
            while(it.hasNext()){
                rh = (RegistroHorario) it.next();
                if(rh.anio() == anio && rh.mes() == mes && rh.dia() == dia){
                    salida.add(rh);
                }
            }
            return salida;
        } 
        
        public float sumarHorasTrabajadas(Set<RegistroHorario> lista){
            float salida = 0;            
            RegistroHorario rh;
            Iterator it = lista.iterator();
             while(it.hasNext()){
                rh = (RegistroHorario) it.next();
                salida =  rh.horasTrabajadas() + salida;
                
             }
            return salida;
        }
        
        public boolean superoMaximoEquipamiento(TipoDeInsumo unTipo){
            boolean salida = true;
            int cont = 0;
            Equipamiento unEquip;
            Iterator it = this.getEquipamientos().iterator();
            while(it.hasNext() & salida){
                
                unEquip = (Equipamiento) it.next();
                if(unEquip.getUnInsumo().getTipoDeInsumo().equals(unTipo)){
                    cont +=1;
                }
            }
            
            if(cont >= 2){
                salida = false;
            }
            return !salida;
        }
        
/*        public List ordenarAplicaciones(int orden){
             List<Aplicacion> aux = new LinkedList();
               switch(orden){
                case 1: 
                Collections.sort(this.registroHorarios, new RegistroHorarioComparator());
                break;                
               }
             return aux;
        }
        */ 
        
        public void modificarDatos(String apellido, String cuil, String dni, Date fechaNacimiento, String nombre){
            this.apellido = apellido;
            this.cuil = cuil;
            this.dni = dni;
            this.fechaNacimiento = fechaNacimiento;
            this.nombre = nombre;
            Empresa.persistencia.update(this);
        }
        public void quitarEquipamiento(Equipamiento unEquipamiento){
            this.equipamientos.remove(unEquipamiento);
            Empresa.persistencia.update(this);
        }
        
        public void ActualizarEquipamiento(Equipamiento unEquipamiento,Insumo unInsumo,boolean obligatorio,Date fecha){
            unEquipamiento.Actualizar(unInsumo,obligatorio,fecha);
           
        }
        
        public void nuevoRol(TipoRol unTipoRol,Date desde){
            //Personal unPersonal, TipoRol unTipoRol, Date desde, Date hasta
            Rol unRol = new Rol(this, unTipoRol,desde,null); //Creo el Tipo de Rol
            this.roles.add(unRol);            
            Empresa.persistencia.update(this);
            unTipoRol.agregarPersonal(unRol);
        }
        public Rol obtenerRolActivo(){
            Rol unRol = null;
            boolean flag= true;
            Iterator it = this.roles.iterator();
            while(it.hasNext() & flag){
                unRol = (Rol) it.next();
                if(unRol.getHasta() == null){
                    flag = false;
                }
            }
                
            return unRol;
        }

        
        public void borrarRol(Rol unRol){
            this.roles.remove(unRol);
            unRol.borrar();
            Empresa.persistencia.update(this);
        }
        
        public List<RegistroHorario> ordenarRegistroHorario() {
            List<RegistroHorario> aux = new LinkedList();
            Collections.sort(this.getRegistroHorarios(), new RegistroHorarioComparator());            
            return aux;

        }
        public List<RegistroHorario> ordenarRegistroHorario(List<RegistroHorario> lista) {
            List<RegistroHorario> aux = new LinkedList();
            Collections.sort(lista, new RegistroHorarioComparator());            
            return aux;

        }

}